package utils.sl651;
import java.util.ArrayList;
import java.util.List;

/**
 * SL651协议各种功能码报文专用解析器
 * 
 * 针对不同功能码提供专门的解析逻辑
 */
public class SL651FunctionCodeParser {
    
    /**
     * 解析链路维持报文（2F）
     */
    public static void parseLinkMaintainReport(SL651Message message) {
        // 链路维持报文通常只包含基本报文头信息，无数据内容
        message.addDataElement("MESSAGE_TYPE", "链路维持报文");
        message.addDataElement("DESCRIPTION", "用于维持通信链路活跃状态");
    }
    
    /**
     * 解析测试报文（30）
     */
    public static void parseTestReport(SL651Message message) {
        message.addDataElement("MESSAGE_TYPE", "测试报文");
        message.addDataElement("DESCRIPTION", "系统测试和设备状态检查");
        
        // 测试报文通常包含当前各传感器的实时数据
        enhanceDataElements(message);
    }
    
    /**
     * 解析定时报文（32）
     */
    public static void parseTimerReport(SL651Message message) {
        message.addDataElement("MESSAGE_TYPE", "定时报文");
        message.addDataElement("DESCRIPTION", "按设定时间间隔定时上报的监测数据");
        
        // 定时报文包含定时采集的监测数据
        enhanceDataElements(message);
        
        // 计算数据统计信息
        SL651DataParsingEnhancer.calculateStatistics(message);
    }
    
    /**
     * 解析加报报文（33）
     */
    public static void parseAddReport(SL651Message message) {
        message.addDataElement("MESSAGE_TYPE", "加报报文");
        message.addDataElement("DESCRIPTION", "监测数据超过预设阈值时主动上报");
        
        // 加报报文需要分析触发条件
        SL651DataParsingEnhancer.analyzeAlarmConditions(message);
        enhanceDataElements(message);
    }
    
    /**
     * 解析小时报文（34）
     */
    public static void parseHourReport(SL651Message message) {
        message.addDataElement("MESSAGE_TYPE", "小时报文");
        message.addDataElement("DESCRIPTION", "整点小时数据及历史时间序列数据");
        
        // 小时报文包含详细的时间序列数据
        enhanceDataElements(message);
        SL651DataParsingEnhancer.parseTimeSeriesData(message);
    }
    
    /**
     * 解析配置报文（31）
     */
    public static void parseConfigReport(SL651Message message) {
        message.addDataElement("MESSAGE_TYPE", "配置报文");
        message.addDataElement("DESCRIPTION", "遥测站参数配置和设置信息");
        
        enhanceDataElements(message);
        
        // 配置报文可能包含配置信息
        SL651DataParsingEnhancer.analyzeConfigurationData(message);
    }
    
    /**
     * 解析人工置数报文（35）
     */
    public static void parseManualDataReport(SL651Message message) {
        message.addDataElement("MESSAGE_TYPE", "人工置数报文");
        message.addDataElement("DESCRIPTION", "人工设置的监测数据和参数");
        
        enhanceDataElements(message);
        
        // 人工置数通常是手动输入的数据
        message.addDataElement("TRIGGER_TYPE", "人工输入");
        message.addDataElement("DATA_SOURCE", "手动设置");
    }
    
    /**
     * 解析实时报文（36）
     */
    public static void parseRealTimeReport(SL651Message message) {
        message.addDataElement("MESSAGE_TYPE", "实时报文");
        message.addDataElement("DESCRIPTION", "实时采集的监测数据");
        
        enhanceDataElements(message);
        
        // 实时报文包含实时采集的数据
        message.addDataElement("DATA_TYPE", "实时数据");
        message.addDataElement("SAMPLING_MODE", "实时采集");
        
        // 解析气象数据（如果包含）
        SL651DataParsingEnhancer.parseWeatherData(message);
    }
    
    /**
     * 解析图片报文（37）
     */
    public static void parsePictureReport(SL651Message message) {
        message.addDataElement("MESSAGE_TYPE", "图片报文");
        message.addDataElement("DESCRIPTION", "包含图像数据的报文");
        
        // 图像报文需要特殊处理
        SL651DataParsingEnhancer.parsePictureData(message);
        
        // 图像元数据解析
        String pictureInfo = message.getDataElement("PIC");
        if (pictureInfo != null) {
            message.addDataElement("MEDIA_TYPE", "图像");
            message.addDataElement("CONTENT_TYPE", "IMAGE");
        }
    }
    
    /**
     * 解析视频报文（38）
     */
    public static void parseVideoReport(SL651Message message) {
        message.addDataElement("MESSAGE_TYPE", "视频报文");
        message.addDataElement("DESCRIPTION", "包含视频数据的报文");
        
        // 视频报文需要特殊处理
        SL651DataParsingEnhancer.parseVideoData(message);
        
        // 视频元数据解析
        String videoInfo = message.getDataElement("VID");
        if (videoInfo != null) {
            message.addDataElement("MEDIA_TYPE", "视频");
            message.addDataElement("CONTENT_TYPE", "VIDEO");
        }
    }
    
    /**
     * 解析人工报文（35）
     */
    public static void parseArtificialReport(SL651Message message) {
        message.addDataElement("MESSAGE_TYPE", "人工报文");
        message.addDataElement("DESCRIPTION", "人工触发的数据报告");
        
        enhanceDataElements(message);
        
        // 人工报文通常是手动触发的即时数据
        message.addDataElement("TRIGGER_TYPE", "人工触发");
        message.addDataElement("DATA_TYPE", "即时监测数据");
    }
    
    /**
     * 解析水泵电机状态报文（37）
     */
    public static void parseWaterPumpReport(SL651Message message) {
        message.addDataElement("MESSAGE_TYPE", "水泵电机状态报文");
        message.addDataElement("DESCRIPTION", "水泵、电机等设备工作状态信息");
        
        // 解析设备状态信息
        SL651DataParsingEnhancer.parseDeviceStatus(message);
    }
    
    /**
     * 解析闸门状态报文（38）
     */
    public static void parseGateReport(SL651Message message) {
        message.addDataElement("MESSAGE_TYPE", "闸门状态报文");
        message.addDataElement("DESCRIPTION", "闸门开启高度等状态信息");
        
        // 解析闸门状态
        SL651DataParsingEnhancer.parseGateStatus(message);
    }
    
    /**
     * 增强数据元素解析
     */
    private static void enhanceDataElements(SL651Message message) {
        // 对已解析的数据元素进行单位转换和格式化
        
        // 使用专业数据解析增强模块
        SL651DataParsingEnhancer.enhanceWeatherDataParsing(message);
        SL651DataParsingEnhancer.enhanceDeviceStatusParsing(message);
        SL651DataParsingEnhancer.enhanceTimeSeriesDataParsing(message);
        
        // 原有的数据处理逻辑
        SL651DataParsingEnhancer.enhanceBasicDataElements(message);
    }
}